package com.gu.callable;

import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;

/**
 * @Author: gusongliao
 * @Description: Callable 接口 和 Runable 接口对比
 * @createDate 2023/05/28 15:10
 */

// 比较两个接口

// 实现 Runnable 接口
class MyThread1 implements Runnable {

    @Override
    public void run() {

    }
}

// 实现 Callable 接口
class MyThread2 implements Callable {

    @Override
    public Integer call() throws Exception {
        return 200;
    }
}

public class CallableAndRunnable {

    public static void main(String[] args) throws ExecutionException, InterruptedException {
        // Runnable接口创建线程
        new Thread(new MyThread1(), "AA").start();

        // Callable接口创建线程
        // 错误写法， Thread 只支持 Runnable接口，直接替换不可用
        // public Thread(Runnable target, String name)
//        new Thread(new MyThread2(), "AA").start();

        // FutureTask
        FutureTask<Integer> futureTask1 = new FutureTask<>(new MyThread2());

        // lam表达式
        FutureTask<Integer> futureTask2 = new FutureTask<>(() -> {
            System.out.println(Thread.currentThread().getName() + " come in");
            return 200;
        });

        new Thread(futureTask2, "BanZhang").start();

        while (!futureTask2.isDone()) {
            System.out.println("wait ...");
        }

        System.out.println(futureTask2.get());

        // 验证只计算一次
        System.out.println(futureTask2.get());

        System.out.println(Thread.currentThread().getName() + " over");

        /**
         * 打印结果
         * wait ...
         * wait ...
         * wait ...
         * wait ...
         * wait ...
         * wait ...
         * BanZhang come in
         * wait ...
         * 200
         * 200  只汇总一次，第二次计算无需等待
         * main over
         */


        //FutureTask 原理 未来任务 只汇总一次
        /**
         * 1、老师上课，口渴了，去买水会影响讲课（主线程），讲课线程继续
         *     找班长帮我去买水（单独开启一个额外线程），把水买回来，需要的时候直接拿水喝。
         *
         * 只汇总一次 第一次找班长买水可能有些要求（不要汽水、不要矿泉水）假如买了果汁，
         * 第二次在找他买水的时候，他会直接把果汁买回来
         */


    }
}
